import re

from rest_framework import serializers

from users.models import User


class AdminSerialzier(serializers.ModelSerializer):
    """
        分组表序列化器
    """

    class Meta:
        # 指定生成序列化字段的模型类
        model = User
        # 指定字段
        fields = "__all__"

    # 手机格式验证
    def validate_mobile(self, attrs):
        if not re.match(r'1[3-9]\d{9}', attrs):
            raise serializers.ValidationError('手机格式不正确')

        # 唯一值判断
        try:
            user = User.objects.get(mobile=attrs)
        except:
            user = None
        if user:
            # 在修改管理员信息时，手机重复是可以验证通过的。
            # 有两种方式，一是获取request对象，如果是POST方式则为添加操作，否则为修改操作
            # 二是 检查 instance是否为None，是的话为添加操作，否则为修改操作
            # if self.instance == None:
            if self.context['request'].method == 'POST':
                raise serializers.ValidationError('手机号已注册')
            else:
                return attrs

        return attrs

    # 重写create方法，用户增加时调用
    def create(self, validated_data):

        # 重写create方法：一、给密码加密，二、设置is_staff为True
        # 第一种方式：先调用父类方法获取保存后的用户对象
        user = super().create(validated_data)
        user.set_password(validated_data['password'])
        user.is_staff = True
        user.save()

        # 第二种方式：
        # user = User.objects.create_user(**validated_data)
        # user.is_staff = True
        # user.save()
        return user

    # 更新管理员信息时，密码会变为明文保存，所以需要重写
    def update(self,instance,validated_data):
        user = super().update(instance,validated_data)
        user.set_password(validated_data['password'])
        user.save()

        return user

